package blog.farb.top.springbootforredis.service;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;

import java.util.Collections;

@Service
public class SellService {
    private final RedisTemplate redisTemplate;

    public SellService(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public String quickBuy(String item, String buyer) {
        String luaScript = """
                local buyer=ARGV[1];
                local productName=KEYS[1];
                local leftCount=tonumber(redis.call('get',productName));
                if(leftCount<=0) then
                	return 0
                else
                	redis.call('decrby',productName,1);
                	redis.call('rpush',"buyerList",buyer)
                	return 1
                end 
                                """;
        // 如果这里不设置序列化器，会使用默认的Jdk会序列器，导致key和value有乱码,而且会导致上面的lua脚本查询不到数据。
        // 当然这里的代码可以移到配置文件中
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        // 注意，这里必须使用Long返回类型，因为redis中的Integer对应java中的Long
        RedisScript<Long> defaultRedisScript = new DefaultRedisScript<>(luaScript, Long.class);
        Object res = redisTemplate.execute(defaultRedisScript, Collections.singletonList(item), buyer);
        return res.toString();
    }
}
